/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package familytree.negocio;

import familytree.persistencia.pojos.Arbol;
import familytree.persistencia.pojos.Nodo;
import familytree.persistencia.pojos.Pareja;
import familytree.persistencia.pojos.Usuario;
import familytree.util.ITree;
import java.util.List;

/**
 *
 * @author Antonio
 */
public interface IArbolProcessor {

    /**
     *Crea un array con estructuras de tipo ITree con los nodos de la familia
     * y la relación con el familiar pasado como parámetro
     * @param nodo Nodo del que se va a generar los Tree
     * @return Array de Tree con información de los nodos y su relación con el parámetro
     */ 
    public ITree[] createTrees(Nodo nodo);

    /**
     Busca un nodo en la base de datos a partir del nombre completo. Nombre y apellidos
     * @param nombre: Nombre completo: Nombre + " " + primerApellido + " " + segundoApellido
     * @param idArbol: Identificador de la familia
     * @return Lista de nodos pertenecientes a la familia cuyo nombre completo
     * coincide con el parámetro <b>nombre<b/>
     */
    public List<Nodo> findNodoByCompleteName(String nombre, String idArbol);

    /**
     * Busca en la base de datos el familiar cuyo nombre y/o apellido encaja con
     * los pasados como parámetros.
     @param nombre Nombre del nodo
     * @param apellido Apellido del nodo
     * @param idArbol Identificador del árbol
     * @return Lista de nodos coincidentes con la búsqueda
     */
    public List<Nodo> findNodosByName(String nombre, String apellidos, String idArbol);

    /**
     * Devuelve todos los miembros de una misma familia
     *@param idArbol: Identificador del árbol
     * @return Devuelve una lista con todos los familiares
     */
    public List<Nodo> findNodosByArbol(String idArbol);
    
    /**
     *Devuelve el camino en forma de array de 2*N desde la raiz de uno de los árboles
     * hasta el nodo pasado como parámetro
     * @param nodo Nodo que se busca
     * @param Árboles con los parentescos
     * @return Devuelve 2 arrays.Uno con los identificadores de los nodos desde la raiz
     * hasta llegar al parámetro, el otro con la relación entre cada nodo del camino
     * con la raiz
     * 
     */
    public String[][] getruta(Nodo nodo,ITree[] familia);
    
    
    /**
     *Añade un árbol a la base de datos
     * @param arbol Arbol a añadir
     */
    void addArbol(Arbol arbol);

    /**
     *Añade una lista de familiares a la familia
     * @param lista Lista de familiares a añadir
     */
    void addComponentes(List<Nodo> lista);

    /**
     *Añade un hijo a la pareja pasada como parámetro
     * @param nodoActual Nodo con el identificador de la familia
     * @param idPareja Pareja a la que se le añade el hijo
     * @param nodoHijo nuevo nodo a insertar
     */
    void anadirHijo(Nodo nodoActual, String idPareja, Nodo nodoHijo);

    /**
     *Añade una madre a un hijo existente
     * 
     */
    void anadirMadre(Pareja p, Nodo madre, Nodo hijo);

    /**
     *Añade un padre a un hijo existente
     */
    void anadirPadre(Pareja p, Nodo padre, Nodo hijo);

    
    /**
     Crea una pareja entre un nuevo nodo y uno existente
     */
    void anadirPareja( Nodo nodo, Nodo conyuje);

    /**
     Crea una familia desde el inicio.Crea una familia con el nodo del usuario y el de los padres.
     * Se almacena en la base de datos
     * 
     */
    Usuario iniciarFamilia(Arbol arbol, Nodo nodoHijo, Nodo nodoPadre, Nodo nodoMadre, Usuario usuario);

    
    /**
     Manda una invitación a un familiar
     * @param direccionDestino Dirección de correo del familiar
     * @param mensaje Mensaje adjunto
     * @param idNodo: Identificador del nodo correspondiente al familiar invitado
     * @param clave Clave para cifrar el nodo
     * @param nombreMiembro Nombre del familiar
     */
    void invitarFamiliar(String direccionDestino, String mensaje, String idNodo, String clave, String nombreMiembro);

    /**
     Modifica el árbol pasado como parámetro
     */
    void setArbol(Arbol arbol);

}
